Emacs Lisp

Emacs Lisp is a pretty bad lisp in my opinion. Dynamic binding rather than lexical binding. Separate namespaces for functions and variables. And more unfortunate choices. From the perspective of a Scheme fan like myself, it's not great.

Yet still, it is my most productive language. From first idea to a reasonably well functioning prototype of a graphical application often takes no more than an hour.

This is because emacs comes with an outright insane amount of functions and libraries that take care of so many otherwise annoying things, because elisp is exceptionally good at text manipulation (although needing different functions to work on strings and buffers can be a bit annoying sometimes), and because elisp has experienced decades of optimising for comfort.

Here are my favourite examples to illustrate that comfort:

(if-let ((a (maybe-get-number 'a))
         (b (maybe-get-number 'b)))
    (+ a b))

(dolist (a '(1 2 3 4))
  (do-thing a))

In scheme, these would be:

(let ((a (maybe-get-number 'a)))
  (when a
    (let ((b (maybe-get-number 'b)))
      (when b
        (+ a b)))))

(for-each (lambda (a)
            (do-thing a))
          '(1 2 3 4))

You can get these easiely in scheme with some macros. However they are just two of many comfort-optimising macros the elisp comes with out of the box.